/** 
* @Title: ThreadScopeShareData.java 
* @Package com.lh.threadtest.t5 
* @Description: TODO
* @author Liu 
* @date 2018年1月16日 下午4:38:55 
* @version V1.0 
*/
package com.lh.threadtest.t6;

import java.util.Random;

/***
 * 
* @ClassName: ThreadLocalTest 
* @Description: ThreadLocal类及应用技巧
* 
* ThreadLocal的作用类似于Map，只不过它的作用更加强大，使用起来更加简单
* 
* 总结：
* 	一个ThreadLocal代表一个变量，故其中只能放一个数据，若有两个变量都要实现线程内共享，则要定义两个
* ThreadLocal对象；如果有100个共享变量呢？那就先定义一对象来封装这100个变量，然后在ThreadLocal中
* 存储这一个对象。这样设计将更加优雅一些。
* 
* @author Liu
* @date 2018年1月16日 下午5:56:31 
*
 */
public class ThreadLocalTest {
	private static ThreadLocal<Integer> x = new ThreadLocal<>();
	
	public static void main(String[] args) {
		for(int i = 0; i < 2; i++){
			new Thread(new Runnable() {
				
				public void run() {
					Integer data = new Random().nextInt();
					System.out.println(Thread.currentThread().getName()
							+ " has put data:" + data
							);
					x.set(data);
					new A().get();
					new B().get();
					new C().get();
				}
			}).start();
		}
	}

	static class A {
		 void get(){
			Integer data = x.get();
			System.out.println("A from " + Thread.currentThread().getName()
					+ " get data:" + data
					);
		}
	}

	static class B {
		 void get(){
			Integer data = x.get();
			System.out.println("B from " + Thread.currentThread().getName()
					+ " get data:" + data
					);
		}
	}

	static class C {
		 void get(){
			Integer data = x.get();
			System.out.println("C from " + Thread.currentThread().getName()
					+ " get data:" + data
					);
		}
	}

}
